/**
在 TypeScript 中，字面量类型（Literal Types）是一种特殊的类型，它表示一个具体的值，而不仅仅是某种类型。字面量类型可以用于字符串、数字和布尔值等基本数据类型。
  1. 字面量类型的定义
  字面量类型允许你指定一个变量只能是某个特定的值。例如：
  - 字符串字面量类型：
  let direction: "left" | "right"; // 只能是 "left" 或 "right"
  direction = "left"; // 合法
  direction = "up"; // 错误：类型“"up"”不可以赋给类型“"left" | "right"”
  - 数字字面量类型：
  let status: 200 | 404 | 500; // 只能是 200、404 或 500
  status = 200; // 合法
  status = 301; // 错误：类型“301”不可以赋给类型“200 | 404 | 500”
  - 布尔字面量类型：
  let isActive: true; // 只能是 true
  isActive = false; // 错误：类型“false”不可以赋给类型“true”
  2. 使用场景
  - 限制变量的取值范围：字面量类型可以用来限制变量只能取特定的值，这在处理状态、方向、选项等场景时非常有用。

  - 与联合类型结合使用：字面量类型可以与其他类型结合，形成更复杂的联合类型。例如：
  type Color = "red" | "green" | "blue";
  let favoriteColor: Color;
  favoriteColor = "red"; // 合法
  favoriteColor = "yellow"; // 错误
  - 函数参数：字面量类型可以用作函数参数，以确保函数只能接收特定的值。例如：
  function setAlignment(alignment: "left" | "center" | "right") {
      // ...
  }

  setAlignment("center"); // 合法
  setAlignment("top"); // 错误
  3. 注意事项
  - 类型推断：TypeScript 可以根据字面量的使用情况推断类型，因此在某些情况下，你可以省略类型声明。
  let color = "red"; // TypeScript 推断 color 的类型为 "red"
  - 与字符串枚举结合使用：字面量类型可以与字符串枚举结合，增强代码的可读性和可维护性。
  enum Direction {
      Up = "UP",
      Down = "DOWN",
      Left = "LEFT",
      Right = "RIGHT"
  }

  let move: Direction = Direction.Up; // 合法
  4. 结论
  字面量类型是 TypeScript 中一个非常有用的特性，可以帮助开发者更精确地控制变量的取值范围，从而提高代码的类型安全性和可读性。在合适的场景下使用字面量类型，可以使代码更加清晰和易于维护。
 */
// 1.字面量类型的基本上
const name: "literal-type" = "literal-type"
let age: 18 = 18

// 2.将多个字面量类型联合起来 |
type Direction = "left" | "right" | "up" | "down"
const d1: Direction = "left"

type MethodType = "get" | "post"
function request(url: string, method: MethodType) {
}
request("/api/users", "post")

// TS细节
const info = {
  url: "/api/users2",
  methods: "post"
}
// request(info.url, info.methods) // info.method获取的是string类型，不是MethodType类型

// 解决方案一: info.method进行类型断言
request(info.url, info.methods as MethodType)

// 解决方案二: 直接让info对象类型是一个字面量类型
const info2: { url: string, methods: "get" | "post" } = {
  url: "/api/users2",
  methods: "post"
}
request(info2.url, info2.methods)


export {}

